package pers.dawnyang.common.xss.config;

import java.io.IOException;
import org.springframework.boot.jackson.JsonComponent;
import org.springframework.util.StringUtils;
import org.springframework.web.util.HtmlUtils;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

/**
 * 对Json字符串做XSS处理
 * 
 * @author dawn yang 2020年8月20日 下午3:32:39
 *
 */
@JsonComponent
public class XssJsonFilter {

  // 只对输入json参数中String类型数据做XSS处理
  public static class XssStringJsonDeserializer extends JsonDeserializer<String> {
    @Override
    public String deserialize(JsonParser p, DeserializationContext ctxt)
        throws IOException, JsonProcessingException {
      if (StringUtils.hasText(p.getText())) {
        // 完全过滤js
        // return Jsoup.clean(p.getText(), Whitelist.relaxed());
        // 对JS转义
        String htmlEscape = HtmlUtils.htmlEscape(p.getText());
        // 在字段级别对输入参数解密
        // String encodeToString = new String(Base64.getDecoder().decode(htmlEscape),
        // "utf-8");
        return htmlEscape;

      } else {
        return p.getValueAsString();
      }
    }
  }

  // 对返回前端的json参数中String类型做XSS处理，为了后端返回数据效率，可以屏蔽
  /*
   * public static class XssStringJsonSerializer extends JsonSerializer<String> {
   * 
   * @Override public Class<String> handledType() { return String.class; }
   * 
   * @Override public void serialize(String value, JsonGenerator jsonGenerator, SerializerProvider
   * serializerProvider) throws IOException { if (StringUtils.hasText(value)) { // 完全过滤js // String
   * encodedValue = Jsoup.clean(value, Whitelist.relaxed()); // 转义js，页面上会正常显示js代码 String // String
   * encodedValue = HtmlUtils.htmlEscape(value, "UTF-8"); // 对返回参数加密 // String encodeToString =
   * Base64.getEncoder().encodeToString(value.getBytes()); jsonGenerator.writeString(value); } else
   * { jsonGenerator.writeNull(); } } }
   */

}
